#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QTimer>
#include <qdatetime.h>
#include <QSerialPortInfo>
#include <qdebug.h>
#include <QProcess>
#include <QSerialPortInfo>
#include <QList>
#include <QDebug>
#include <stdio.h>
#include <stdlib.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

#define MAX_RECV_BUF_SIZE   (10 * 1024)
#define UART_REVICE_BUF_SIZE     512
#define UART_SEND_BUF_SIZE       256

typedef struct _cycle_buf {
    unsigned int    head;
    unsigned int    tail;
    unsigned int    size;
    unsigned char   data_buf[MAX_RECV_BUF_SIZE];
}CYCLE_BUF;

#pragma pack(push, 1)
typedef struct
{
  unsigned char          region;         //行政区
  unsigned char          management;     //管理处
  unsigned char          station;        //站所
  unsigned short         stake_front;    //桩号（前）
  unsigned short         stake_back;     //桩号（后）
  unsigned char          dev_type;       //设备类型
  unsigned char          dev_vender;     //设备厂家
  unsigned char          serial;         //顺序编号
}ADDR;

typedef struct
{
  /* 设备信息 */
  ADDR                  addr;                                           // 设备编号
  int16_t               password;                                       // 设备密钥
  float                hardware_version;                               // 硬件版本
  float                software_version;                               // 软件版本
  /* 门限设置 */
  int32_t               encoder_upper_limit;                            // 编码器上限
  int32_t               encoder_lower_limit;                            // 编码器下限
  int16_t               gate_front_water_stage_upper_limit;             // 闸前水位上限
  int16_t               gate_front_water_stage_lower_limit;             // 闸前水位下限
  int16_t               gate_back_water_stage_upper_limit;              // 闸后水位上限
  int16_t               gate_back_water_stage_lower_limit;              // 闸后水位下限
  int16_t               voltage_upper_limit;                            // 电压上限
  int16_t               voltage_lower_limit;                            // 电压下限
  int16_t               current_upper_limit;                            // 电流上限
  int16_t               current_lower_limit;                            // 电流下限
  int16_t               temperature_upper_limit;                        // 温度上限
  int16_t               temperature_lower_limit;                        // 温度下限
  /* 设备参数设置 */
  int8_t                gate_front_water_stage_addr;                    // 闸前水位地址
  int8_t                gate_back_water_stage_addr;                     // 闸后水位地址
  int16_t               gate_front_water_stage_zero;                    // 闸前水位零值
  int16_t               gate_back_water_stage_zero;                     // 闸后水位零值
  int32_t               gate_height;                                    // 闸门高度
  int32_t               gate_width;                                     // 闸门宽度
  int32_t               gate_full_open_time;                            // 闸门全开时间
  float                angle_to_displacement_coefficient;              // 角度转换为位移的系数
  /* 服务器 */
  uint8_t               upload_target_server_ip[4];                     // 服务器ip地址
  int16_t               upload_target_port;                             // 服务器端口
  int16_t               reconnect_server_timer;                         // 重连时间 :单位 ： 120
  /*  */

} HYPER_PARAMETER;
#pragma pack(pop)
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void uart_data_handle();

private slots:
    void on_timer();

    void on_uart_data_recive();

    void on_btn_open_clicked();

    void on_serversimuart_BtnRefresh_clicked();

    void on_btn_set_mode_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_device_parameter_get_clicked();

    void on_device_parameter_set_clicked();

private:
    Ui::MainWindow *ui;

    void ui_default_value_init();

    void input_restrict();

    void input_restrict_len();

    void uart_data_edit_show( unsigned char * data, uint len );

    void recv_hyper_parameter_to_show();

    void hex_to_str(const uint8_t *data, int len, char *output);

    //serial
    QSerialPort     mSerial;
    QTimer          mTimer;
    CYCLE_BUF       mCycle_buf;
    unsigned char   uart_recv_buf[UART_REVICE_BUF_SIZE];
    unsigned char   sendbuf[UART_SEND_BUF_SIZE];
    QList<QSerialPortInfo> serialPortInfo;
    //flag
    bool flag_uart_open             = false;
    bool flag_uart_recive           = false;
    bool flag_set_parameter_mode    = false;
};
#endif // MAINWINDOW_H
